home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / HTML / Javascript.php < prev    next >
PHP Script  |  2004-03-24  |  18KB  |  562 lines

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 4                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2003 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 3.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/3_0.txt.                                  |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Tal Peer <tal@php.net>                                      |
  17. // |          Pierre-Alain Joye <paj@pearfr.org>                          |
  18. // +----------------------------------------------------------------------+
  19. // $Id: Javascript.php,v 1.32 2003/05/02 00:28:15 pajoye Exp $
  20.  
  21. /**
  22.  * A class for performing basic JavaScript operations
  23.  *
  24.  * Usage example:
  25.  * <code>
  26.  * echo "<html><head><title>JS Test</title></head><body>";
  27.  * $js = new HTML_Javascript();
  28.  * echo $js->startScript();
  29.  * echo $js->writeLine('foo',false);
  30.  * echo $js->writeLine('bar[0]', true);
  31.  * echo $js->writeLine('bar[3]', true);
  32.  * echo $js->endScript();
  33.  * echo "</body></html>";
  34.  * </code>
  35.  * TODO:
  36.  * - Error handler
  37.  * - Validation mechanism
  38.  * - Rollovers
  39.  * - Importation from external files
  40.  * - Themed popups
  41.  *
  42.  * @author  Tal Peer <tal@php.net>
  43.  * @author  Pierre-Alain Joye <paj@pearfr.org>
  44.  * @version 1.1.3
  45.  * @package HTML_Javascript
  46.  * @example examples/javascript.php Usage of HTML_Javascript
  47.  * @licence http://www.php.net/license/3_0.txt PHP Licence 3.0
  48.  * @access  public
  49.  */
  50.  
  51. //Error codes
  52.  
  53. /**
  54.  * No script started error
  55.  */
  56. define('HTML_JAVASCRIPT_ERROR_NOSTART', 500, true);
  57.  
  58. /**
  59.  * Unknown error
  60.  */
  61. define('HTML_JAVASCRIPT_ERROR_UNKNOWN', 599, true);
  62.  
  63. /**
  64.  * Last script was not ended error
  65.  */
  66. define('HTML_JAVASCRIPT_ERROR_NOEND', 501, true);
  67.  
  68. /**
  69.  * No file was specified for setOutputMode()
  70.  */
  71. define('HTML_JAVASCRIPT_ERROR_NOFILE', 505, true);
  72.  
  73. //Output modes
  74. /**
  75.  * Just return the results (default mode)
  76.  */
  77. define('HTML_JAVASCRIPT_OUTPUT_RETURN', 1);
  78.  
  79. /**
  80.  * Echo (print) the results directly to browser
  81.  */
  82. define('HTML_JAVASCRIPT_OUTPUT_ECHO', 2);
  83.  
  84. /**
  85.  * Print the results to a file
  86.  */
  87. define('HTML_JAVASCRIPT_OUTPUT_FILE', 3);
  88.  
  89. if(!defined('HTML_JAVASCRIPT_NL')){
  90.     /** Linefeed to use, default set to Unix linefeed.
  91.      * Define it before the include/require if you want to
  92.      * override it.
  93.      */
  94.     define('HTML_JAVASCRIPT_NL', "\n");
  95. }
  96.  
  97. /** Convertion tools */
  98. require_once('HTML/Javascript/Convert.php');
  99.  
  100. /**
  101.  * Main Javascript class
  102.  *
  103.  * Provides the basic function to output Javascript
  104.  * scripts, like start and end tags or set the output mode.
  105.  * @package HTML_Javascript
  106.  */
  107. class HTML_Javascript
  108. {
  109.     /**
  110.      * Used to determaine if a script has been started
  111.      *
  112.      * @var    boolean $_started
  113.      * @access private
  114.      */
  115.     var $_started = false;
  116.  
  117.     /**
  118.      * The output mode specified for the script
  119.      *
  120.      * @var    integer $_mode
  121.      * @access private
  122.      */
  123.     var $_mode = HTML_JAVASCRIPT_OUTPUT_RETURN;
  124.  
  125.     /**
  126.      * The file to direct the output to
  127.      *
  128.      * @var    string $_file
  129.      * @access private
  130.      */
  131.     var $_file = '';
  132.  
  133.     // {{{ HTML_Javascript
  134.  
  135.     /**
  136.      * Constructor - creates a new HTML_Javascript object
  137.      *
  138.      * @access public
  139.      */
  140.     function HTML_Javascript()
  141.     {
  142.     }
  143.  
  144.     // }}} HTML_Javascript
  145.     // {{{ setOutputMode
  146.  
  147.     /**
  148.      * Set the output mode for the script
  149.      *
  150.      * @param  integer  $mode  the chosen output mode, can be either
  151.      *                         {@link HTML_JAVASCRIPT_OUTPUT_RETURN},
  152.      *                         {@link HTML_JAVASCRIPT_OUTPUT_ECHO}  or
  153.      *                         {@link HTML_JAVASCRIPT_OUTPUT_FILE}
  154.      * @param  string   $file  the path to the file
  155.      *                         (if $mode is {@link HTML_JAVASCRIPT_OUTPUT_FILE})
  156.      * @see getOutputMode
  157.      * @access public
  158.      * @return mixed    PEAR_Error or true
  159.      */
  160.     function setOutputMode($mode = HTML_JAVASCRIPT_OUTPUT_RETURN, $file = NULL)
  161.     {
  162.         if($mode == HTML_JAVASCRIPT_OUTPUT_FILE ) {
  163.             if(isset($file)) {
  164.                 $this->_file = $file;
  165.             } else {
  166.                 $this->raiseError(HTML_JAVASCRIPT_ERROR_NOFILE);
  167.             }
  168.         }
  169.         $this->_mode = $mode;
  170.         return true;
  171.     }
  172.  
  173.     // }}} setOutputMode
  174.     // {{{ setOutputMode
  175.  
  176.     /**
  177.      * Get the output mode for the script
  178.      *
  179.      * @see setOutputMode
  180.      * @access public
  181.      * @return mixed    PEAR_Error or true
  182.      */
  183.     function getOutputMode()
  184.     {
  185.  
  186.         return $this->_mode;
  187.     }
  188.  
  189.     // }}} setOutputMode
  190.     // {{{ raiseError
  191.  
  192.     /**
  193.      * A custom error handler
  194.      *
  195.      * @access private
  196.      * @param  integer  $code the error code
  197.      * @return mixed    false if the error code is invalid,
  198.      *                  or a PEAR_Error otherwise
  199.      */
  200.     function raiseError($code)
  201.     {
  202.         $ret = null;
  203.         include_once('PEAR.php');
  204.         switch ($code) {
  205.             case HTML_JAVASCRIPT_ERROR_NOSTART:
  206.                 $ret = PEAR::raiseError(
  207.                         'No script started',
  208.                         HTML_JAVASCRIPT_ERROR_NOSTART
  209.                         );
  210.                 break;
  211.             case HTML_JAVASCRIPT_ERROR_NOEND:
  212.                 $ret = PEAR::raiseError(
  213.                         'Last script was not ended',
  214.                         HTML_JAVASCRIPT_ERROR_NOEND
  215.                         );
  216.                 break;
  217.             case HTML_JAVASCRIPT_ERROR_NOFILE:
  218.                 $ret = PEAR::raiseError(
  219.                         'A filename must be specified for setoutputMode()',
  220.                         HTML_JAVASCRIPT_ERROR_NOFILE
  221.                         );
  222.                 break;
  223.             default:
  224.                 return HTML_Javascript_Convert::raiseError(
  225.                         'Unknown Error',
  226.                         HTML_JAVASCRIPT_ERROR_UNKNOWN
  227.                         );
  228.                 break;
  229.         }
  230.  
  231.         return $ret;
  232.     }
  233.  
  234.     // }}} raiseError
  235.     // {{{ startScript
  236.  
  237.     /**
  238.      * Starts a new script
  239.      *
  240.      * @param  bool     $defer whether to wait for the whole page to load
  241.      *                  before starting the script or no. Use defer only
  242.      *                  with script that does not change the document (i.e.
  243.      *                  alert does not change it).
  244.      *
  245.      * @access public
  246.      * @return mixed    a PEAR_Error if a script has been already started
  247.      *                  or a string (HTML tag <script>)
  248.      */
  249.     function startScript($defer = true)
  250.     {
  251.         $this->_started = true;
  252.         $s      = $defer ? 'defer="defer"' : '';
  253.         //$s      = $defer ? 'defer' : '';
  254.         $ret    = "<script type=\"text/javascript\" ".$s.">".
  255.                     HTML_JAVASCRIPT_NL;
  256.         return $ret;
  257.     }
  258.  
  259.     // }}} startScript
  260.     // {{{ endScript
  261.  
  262.     /**
  263.      * Used to end the script (</script>)
  264.      *
  265.      * @return mixed    PEAR_Error if no script has been started
  266.      *                  or the end tag for the script
  267.      * @access public
  268.      */
  269.     function endScript()
  270.     {
  271.         if ($this->_started) {
  272.             $this->_started = false;
  273.             $ret =  "</script>".HTML_JAVASCRIPT_NL;
  274.         } else {
  275.             $ret =  HTML_Javascript::raiseError(HTML_JAVASCRIPT_ERROR_NOSTART);
  276.         }
  277.         return $ret;
  278.     }
  279.  
  280.     // }}} endScript
  281.     //{{{ _out
  282.  
  283.     /**
  284.      * Checks the output mode and acts according to it
  285.      *
  286.      * @param  string   $str the string returned from the calling function
  287.      * @return mixed    depends on the output mode,
  288.      *                  $str if it's HTML_JAVASCRIPT_OUTPUT_RETURN, true otherwise
  289.      * @access private
  290.      */
  291.     function _out($str)
  292.     {
  293.         static $fp;
  294.         if( isset($this) ){
  295.             $mode = $this->_mode;
  296.             $file = $this->_file;
  297.         } else {
  298.             return $str;
  299.         }
  300.         switch($mode) {
  301.             case HTML_JAVASCRIPT_OUTPUT_RETURN: {
  302.                 return $str;
  303.                 break;
  304.             }
  305.  
  306.             case HTML_JAVASCRIPT_OUTPUT_ECHO: {
  307.                 echo $str;
  308.                 return true;
  309.                 break;
  310.             }
  311.  
  312.             case HTML_JAVASCRIPT_OUTPUT_FILE: {
  313.                 $fp = fopen($file, 'ab');
  314.                 fwrite($fp, $str);
  315.                 return true;
  316.                 break;
  317.             }
  318.             default: {
  319.                 HTML_Javascript::raiseError('Invalid output mode');
  320.                 break;
  321.             }
  322.         }
  323.     }
  324.  
  325.     // }}} _out
  326.     // {{{ write
  327.  
  328.     /**
  329.      * A wrapper for document.writeln
  330.      *
  331.      * @access public
  332.      * @param  string  $str the string to output
  333.      * @param  boolean $var set to true if $str is a variable name
  334.      * @return mixed   PEAR_Error if no script was started or the processed string
  335.      */
  336.     function write($str, $var = false)
  337.     {
  338.         if ($var) {
  339.             $ret = HTML_Javascript::_out(
  340.                     'document.writeln('.$str.')'.HTML_JAVASCRIPT_NL
  341.                     );
  342.         } else {
  343.             $ret = HTML_Javascript::_out(
  344.                         'document.writeln("'.
  345.                         HTML_Javascript_Convert::escapeString($str).'")'.
  346.                         HTML_JAVASCRIPT_NL
  347.                     );
  348.         }
  349.         return $ret;
  350.     }
  351.  
  352.     // }}} write
  353.     // {{{ writeLine
  354.  
  355.     /**
  356.      * A wrapper for document.writeln with an addtional <br /> tag
  357.      *
  358.      * @access public
  359.      * @param  string  $str the string to output
  360.      * @param  boolean $var set to true if $str is a variable name
  361.      * @return mixed   PEAR_Error if no script was started *
  362.      *                 or the processed string
  363.      */
  364.     function writeLine($str, $var = false)
  365.     {
  366.         if ($var) {
  367.             $ret = HTML_Javascript::_out(
  368.                     'document.writeln('.$str.'+"<br />")'.HTML_JAVASCRIPT_NL
  369.                     );
  370.         } else {
  371.             $ret = HTML_Javascript::_out(
  372.                         'document.writeln("'.
  373.                         HTML_Javascript_Convert::escapeString($str).
  374.                         '"+"<br />")'.HTML_JAVASCRIPT_NL
  375.                     );
  376.         }
  377.         return $ret;
  378.     }
  379.  
  380.     // }}} writeLine
  381.     // {{{ alert
  382.  
  383.     /**
  384.      * A wrapper for alert
  385.      *
  386.      * @access public
  387.      * @param  string    $str the string to output
  388.      * @param  boolean   $var set to true if $str is a variable name
  389.      * @return mixed     PEAR_Error if no script was started
  390.      *                   or the processed string
  391.      */
  392.     function alert($str, $var = false)
  393.     {
  394.         $alert  = 'alert(';
  395.         $alert  .= $var?
  396.                     $str:
  397.                     '"' . HTML_Javascript_Convert::escapeString($str) . '"';
  398.         $ret = HTML_Javascript::_out($alert.')'.HTML_JAVASCRIPT_NL);
  399.         return $ret;
  400.     }
  401.  
  402.     // {{{ alert
  403.     // {{{ confirm
  404.  
  405.     /**
  406.      * Create a box with yes and no buttons.
  407.      * In futur releases, the 1st arg will change, $str will always be the 1st
  408.      * argument, $assign the 2nd.
  409.      *
  410.      * @param  string $assign   the JS variable to assign the confirmation box to
  411.      * @param  string $str      the string that will appear in the confirmation box
  412.      * @param  bool   $var      whether $str is a JS var or not
  413.      * @return string the processed string
  414.      */
  415.     function confirm($assign, $str, $var = false)
  416.     {
  417.         if($var) {
  418.             $confirm = 'confirm(' . $str . ')' . HTML_JAVASCRIPT_NL;
  419.         } else {
  420.             $confirm = 'confirm("' .
  421.                 HTML_Javascript_Convert::escapeString($str) . '")' .
  422.                 HTML_JAVASCRIPT_NL;
  423.         }
  424.         $ret = HTML_Javascript::_out($assign . ' = ' . $confirm);
  425.         return $ret;
  426.     }
  427.  
  428.     // }}} confirm
  429.     // {{{ prompt
  430.  
  431.     /**
  432.      * Open a propmt (input box)
  433.      *
  434.      * @param  string $str     the string that will appear in the prompt
  435.      * @param  string $assign  the JS var that the input will be assigned to
  436.      * @param  string $default the default value
  437.      * @param  string $var     wether $str is a JS var or not
  438.      * @return mixed  PEAR_Error or the processed string
  439.      */
  440.     function prompt($str, $assign, $default = '', $var = false)
  441.     {
  442.         if ($var) {
  443.             $prompt = 'prompt('.$str.', "'.$default.')"'.HTML_JAVASCRIPT_NL;
  444.         } else {
  445.  
  446.             $prompt = 'prompt("'.
  447.                         HTML_Javascript_Convert::escapeString($str).
  448.                         '", "'.$default.
  449.                         '")'.HTML_JAVASCRIPT_NL;
  450.         }
  451.         $ret = HTML_Javascript::_out($assign .' = ' . $prompt);
  452.         return $ret;
  453.     }
  454.  
  455.     // }}} prompt
  456.     // {{{ popup
  457.  
  458.     /**
  459.      * A method for easy generation of popup windows
  460.      *
  461.      * @param  string $assign   the JS var to assign the window to
  462.      * @param  string $file     the file that will appear in the new window
  463.      * @param  string $title    the title of the new window
  464.      * @param  int    $width    the width of the window
  465.      * @param  int    $height   the height of the window
  466.      * @param  mixed  $attr     an array containing the attributes for the new
  467.      *                          window, each cell can contain either the ints 1/0
  468.      *                          or the strings 'yes'/'no'.
  469.      *                          The order of attributes:
  470.      *                          resizable, scrollbars, menubar, toolbar,
  471.      *                          status, location.
  472.      *                          Can be also a boolean, and then all the attributes
  473.      *                          are set to yes or no, according to the boolean value.
  474.      * @param  int   $top       the distance from the top, in pixels.
  475.      * @param  int   $left      the distance from the left, in pixels.
  476.      * @return mixed PEAR_Error on error or the processed string.
  477.      */
  478.     function popup(
  479.         $assign, $file, $title, $width, $height, $attr, $top = 300, $left = 300
  480.     )
  481.     {
  482.         if(!is_array($attr)) {
  483.             if(!is_bool($attr)) {
  484.                 PEAR::raiseError('$attr should be either an array or a boolean');
  485.             } else {
  486.                 if($attr) {
  487.                     $attr = array('yes', 'yes', 'yes', 'yes', 'yes', 'yes', $top, $left);
  488.                 } else {
  489.                     $attr = array('no', 'no', 'no', 'no', 'no', 'no', $top, $height);
  490.                 }
  491.             }
  492.         }
  493.         $ret = HTML_Javascript::_out(
  494.                     $assign .
  495.                     "= window.open(".
  496.                     "\"$file\", \"$title\",".
  497.                     " \"width=$width, height=$height,".
  498.                     "resizable=$attr[0], scrollbars=$attr[1],".
  499.                     " menubar=$attr[2], toolbar=$attr[3], status=$attr[4],".
  500.                     " location=$attr[5], top=$attr[6], left=$attr[7]\")".
  501.                     HTML_JAVASCRIPT_NL);
  502.         return $ret;
  503.     }
  504.  
  505.     // }}} popup
  506.     // {{{ popupWrite
  507.  
  508.     /**
  509.      * Creates a new popup window containing a string. Inside the popup windows
  510.      * you can access the opener window with the opener var.
  511.      *
  512.      * @param  string $assign   the JS variable to assign the window to
  513.      * @param  string $str      the string that will appear in the new window
  514.      *                          (HTML tags would be parsed by the browser, of course)
  515.      * @param  string $title    the title of the window
  516.      * @param  int    $width    the width of the window
  517.      * @param  int    $height   the height of the window
  518.      * @param  mixed  $attr     see popup()
  519.      * @param  int    $top      distance from the top (in pixels
  520.      * @param  int    $left     distance from the left (in pixels)
  521.      * @see    popup()
  522.      * @return the processed string
  523.      */
  524.     function popupWrite(
  525.         $assign, $str, $title, $width, $height, $attr, $top = 300, $left = 300
  526.     )
  527.     {
  528.         static  $cnt_popup;
  529.         $str        = HTML_Javascript_Convert::escapeString($str);
  530.         $assign     = strlen($assign)==0?'pearpopup'.$cnt_popup++:$assign;
  531.  
  532.         if($attr) {
  533.             $attr = array('yes', 'yes', 'yes', 'yes', 'yes', 'yes', $top, $left);
  534.         } else {
  535.             $attr = array('no', 'no', 'no', 'no', 'no', 'no', $top, $height);
  536.         }
  537.  
  538.         $windows = $assign . "= window.open(\"\",".
  539.                                 " \"$title\",".
  540.                                 " \"width=$width, height=$height,".
  541.                                 " resizable=$attr[0], scrollbars=$attr[1],".
  542.                                 " menubar=$attr[2], toolbar=$attr[3],".
  543.                                 " status=$attr[4], location=$attr[5],".
  544.                                 " top=$attr[6], left=$attr[7]\")".HTML_JAVASCRIPT_NL;
  545.  
  546.         $windows    .= "
  547.                         if ($assign){
  548.                             $assign.focus();
  549.                             $assign.document.open();
  550.                             $assign.document.write('$str');
  551.                             $assign.document.close();
  552.                             if ($assign.opener == null) $assign.opener = self;
  553.                         }
  554.                       ";
  555.  
  556.         $ret = HTML_Javascript::_out($windows);
  557.         return $ret;
  558.     }
  559.  
  560.     // }}} popupWrite
  561. }
  562. ?>